home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™ 1987-1994 / MacHack™ '91 / Hacks '91 / ReturnOpens ƒ / returnOpens.p < prev    next >
Encoding:
Text File  |  1991-06-21  |  2.7 KB  |  118 lines  |  [TEXT/MPS ]

  1.  
  2. UNIT ReturnOpens;
  3.  
  4. INTERFACE
  5. USES
  6.     MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf, Traps, Processes,MemEnd;
  7.  
  8. PROCEDURE InitMain;
  9. IMPLEMENTATION
  10.  
  11. PROCEDURE CallGOSE; INLINE $2253,$2848,$4e91,$2f00;
  12. PROCEDURE RestoreA0D0; INLINE $201f, $204c;
  13.     
  14.  
  15. PROCEDURE MyGOSE; FORWARD;
  16.                 
  17. FUNCTION FindPSNByType(processSig:ResType; VAR thePSN:ProcessSerialNumber):BOOLEAN; FORWARD;
  18. FUNCTION IsDialogWindow:BOOLEAN; FORWARD;
  19.  
  20.  
  21. PROCEDURE InitMain;
  22. VAR
  23.     savedGOSEAddrPtr :^LONGINT;
  24.     copySize :LONGINT;
  25.     reloc :Ptr;
  26. BEGIN
  27.     copySize := LONGINT(@MyMemory)-LONGINT(@MyGOSE);
  28.     reloc := NewPtrSys(copySize+32);
  29.     IF reloc = NIL THEN EXIT(InitMain);
  30.     BlockMove(@MyGOSE, reloc, copySize);
  31.     Ptr(savedGOSEAddrPtr) := Ptr(LONGINT(reloc)+copySize);
  32.     
  33.     savedGOSEAddrPtr^ := NGetTrapAddress($A031,OSTrap);
  34.     NSetTrapAddress(LONGINT(reloc),$A031,OSTrap);
  35.     END; {InitMain}
  36.  
  37. PROCEDURE MyGOSE;
  38. LABEL 999;
  39. CONST
  40.     cmdKeyBit = 0;
  41. VAR
  42.     savedGOSEAddrPtr :^LONGINT;
  43.     aPSN,bPSN,cPSN :ProcessSerialNumber;
  44.     aQ :EvQElPtr;
  45.     err :OSErr;
  46.     erp :^EventRecord;
  47. BEGIN
  48.     savedGOSEAddrPtr := @MyMemory;
  49.     CallGOSE;
  50.     
  51.     IF erp^.what <> keyDown THEN  goto 999;
  52.     IF CHAR(BAND(erp^.message,$FF)) <> CHR($0D) THEN  goto 999;
  53.     
  54.     IF NOT FindPSNByType('MACS',aPSN) THEN goto 999;
  55.     err := GetFrontProcess(bPSN);
  56.     err := GetCurrentProcess(cPSN);
  57.     IF (aPSN.highLongOfPSN <> bPSN.highLongOfPSN) OR
  58.         (aPSN.lowLongOfPSN <> bPSN.lowLongOfPSN) OR
  59.         (aPSN.highLongOfPSN <> cPSN.highLongOfPSN) OR
  60.         (aPSN.lowLongOfPSN <> cPSN.lowLongOfPSN) THEN  goto 999;
  61.  
  62.     IF IsDialogWindow THEN  goto 999;
  63.     
  64.     erp^.what := keyDown;
  65.     (* BSET(LONGINT(erp^.modifiers,cmdKeyBit); *)
  66.     erp^.message := LONGINT('o');
  67.     erp^.modifiers := BOr(erp^.modifiers, 256+128);
  68.     
  69.     (*
  70.     err := PPostEvent(keyDown,LONGINT('o'),aQ);
  71.     BSET(LONGINT(aQ^.evtQModifiers),cmdKeyBit);
  72.     *)
  73.  
  74. 999: RestoreA0D0;
  75.     END; {MyGOSE}
  76.  
  77.  
  78. FUNCTION FindPSNByType(processSig:ResType; VAR thePSN:ProcessSerialNumber):BOOLEAN;
  79. VAR
  80.     info:         ProcessInfoRec;
  81.     fSpec:         FSSpec;
  82.     psn:         ProcessSerialNumber;
  83.     tempBool:    Boolean;
  84. BEGIN
  85.     tempBool := FALSE;    {not yet!}
  86.     
  87.     info.processInfoLength := sizeof(ProcessInfoRec);
  88.     info.processName := nil;
  89.     info.processAppSpec := @fSpec;
  90.     psn.highLongOfPSN := 0;
  91.     psn.lowLongOfPSN := kNoProcess;
  92.  
  93.     WHILE (GetNextProcess(psn) = noErr) DO 
  94.     BEGIN
  95.         IF (GetProcessInformation(psn, info) = noErr) THEN
  96.         BEGIN
  97.             IF (info.processSignature = processSig) THEN 
  98.             BEGIN
  99.                 thePSN := psn;
  100.                 tempBool := TRUE;
  101.             END;
  102.         END;
  103.     END;
  104.     
  105.     FindPSNByType := tempBool;
  106. END; {FindPSNByType}
  107.  
  108. FUNCTION IsDialogWindow:BOOLEAN;
  109. VAR aWind,bWind :WindowPeek;
  110. BEGIN
  111.     aWind := WindowPeek(FrontWindow);
  112.     IF  POS('Desktop',aWind^.titleHandle^^) = 1 THEN
  113.         IsDialogWindow := FALSE
  114.     ELSE
  115.         IsDialogWindow := NOT aWind^.spareFlag;
  116.     END; {IsDialogWindow}
  117.  
  118. END.